package com.zhima.service;

import com.zhima.entity.ZhimaMinioUploadFileResponse;
import com.zhima.exception.ZhimaMinioException;
import io.minio.errors.*;

import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

public interface ZhimaMinioService {

    /**
     * 上传文件至 yyyy/MM/dd/文件md5值.原拓展名
     *
     * @param bucket   上传到哪个桶
     * @param fileName 上传文件的原始文件名
     * @param bytes    文件字节流
     * @return 文件上传在minio中的路径
     * @throws ServerException
     * @throws InsufficientDataException
     * @throws ErrorResponseException
     * @throws IOException
     * @throws NoSuchAlgorithmException
     * @throws InvalidKeyException
     * @throws InvalidResponseException
     * @throws XmlParserException
     * @throws InternalException
     */
    ZhimaMinioUploadFileResponse uploadFile(String bucket, String fileName, byte[] bytes) throws ZhimaMinioException;


    /**
     * 上传本地文件
     *
     * @param bucket           上传到到哪个桶
     * @param fileAbsolutePath 要上传文件的绝对路径
     * @return 文件上传在minio中的路径
     * @throws IOException
     * @throws ServerException
     * @throws InsufficientDataException
     * @throws ErrorResponseException
     * @throws NoSuchAlgorithmException
     * @throws InvalidKeyException
     * @throws InvalidResponseException
     * @throws XmlParserException
     * @throws InternalException
     */
    ZhimaMinioUploadFileResponse uploadFile(String bucket, String fileAbsolutePath) throws ZhimaMinioException;

    /**
     * 合并分块文件
     * 所有的分块文件在 yyyy/MM/dd/fileMd5第一位/fileMd5第二位/chunkFolderName目录下
     *
     * @param bucket        分块文件在哪个桶
     * @param fileMd5       原始文件的md5值
     * @param chunkFileName 分块文件的原始文件名
     * @param chunkSize     分块总数
     * @return
     * @throws IOException
     */
    ZhimaMinioUploadFileResponse mergeChunk(String bucket, String fileMd5, String chunkFileName, Integer chunkSize) throws ZhimaMinioException;

    /**
     * 检查是否存在chunkIndex分块
     * 即是否存在 yyyy/MM/dd/fileMd5第一位/fileMd5第二位/chunkFolderName/chunkIndex文件
     *
     * @param bucket
     * @param fileMd5
     * @param chunkIndex
     * @return
     */
    boolean checkChunk(String bucket, String fileMd5, Integer chunkIndex) throws ZhimaMinioException;

    /**
     * 返回在桶中是否对象名的文件存在
     *
     * @param bucket     在那个桶里
     * @param objectName 对象名
     * @return 返回是否存在
     * @throws ServerException
     * @throws InsufficientDataException
     * @throws ErrorResponseException
     * @throws IOException
     * @throws NoSuchAlgorithmException
     * @throws InvalidKeyException
     * @throws InvalidResponseException
     * @throws XmlParserException
     * @throws InternalException
     */
    boolean existsFile(String bucket, String objectName) throws ZhimaMinioException;

    /**
     * 在指定桶中下载对象名的文件
     *
     * @param bucket     在哪个桶里面
     * @param objectName 对象名
     * @return 文件字节数组
     * @throws ServerException
     * @throws InsufficientDataException
     * @throws ErrorResponseException
     * @throws IOException
     * @throws NoSuchAlgorithmException
     * @throws InvalidKeyException
     * @throws InvalidResponseException
     * @throws XmlParserException
     * @throws InternalException
     */
    byte[] download(String bucket, String objectName) throws ZhimaMinioException;

    /**
     * 删除桶中的文件
     *
     * @param bucket
     * @param objectName
     */
    void deleteFile(String bucket, String objectName) throws ZhimaMinioException;
}
